﻿#pragma once
#include "MarketDataStream.h"

class KSynthesisBase
{
public:
	KSynthesisBase(const std::string &pSymbol);
	virtual ~KSynthesisBase();
	// 设置当前的校验时间，设置为合成的截止时间
	void SetVerifyTime(time_t pTime);
	// 更新收线
	void UpdateCloseValue(MData::KLineItem &outLastKItem, const MData::KLineItem &pnItem);
	// 得到这个时间范围内的分钟K线
	void GetMinuteKItems(const std::deque<MData::KLineItem> &frmKItems, time_t beginTime, time_t endTime, std::deque<MData::KLineItem> &outKItems);

	// 给定了批量的原始K线
	virtual void SynthesisFrmList(const std::deque<MData::KLineItem> &frmKItems, std::deque<MData::KLineItem> &outKItems) = 0;
	// 给定了1个日期
	virtual void SynthesisFrmDate(time_t pDate, std::deque<MData::KLineItem> &outKItems) = 0;
	// 给定了一个时间范围
	virtual void SynthesisFrmRange(time_t frmTime, time_t endTime, std::deque<MData::KLineItem> &outKItems) = 0;
	// 给定了一个具体的时间
	virtual void SynthesisFrmTime(time_t pTime, MData::KLineItem &outKItem) = 0;
	//************************************
	// Method:    根据给定的具体时间判断这个K线是否可以合成了
	// Parameter: time_t pLaskKUpdateTime 上跟K线的更新时间，注意未0时返回false  这是分钟K线
	// Parameter: time_t curTime 当前的行情时间
	//************************************
	virtual bool IsThisKItemFinished(time_t pLaskKUpdateTime, time_t curTime) = 0;
	
protected:
	// 获取当前K线的范围
	virtual void getKItemRange(time_t pUpdateTime, time_t &outKItemBegin, time_t &outKItemEnd) = 0;
	// 判断分钟K线是否是完整状态
	inline bool isSrcKItemFull(const MData::KLineItem &pkItem);
	// 判断是否是竞价段 一定是线判断是否完整
	bool IsBidingItem(time_t pItemTime);
	// 判断是否是尾行情段  一定是线判断是否完整
	bool IsMarketEnd(time_t pItemTime);

	// 校验时间，用来估算当前的ctp行情段
	time_t m_verifyTime;
	std::string m_symbolName; // 合约名称

private:
	bool isInRange(time_t pItemTime, int beginHour, int beginMin, int beginSec, int endHour, int endMin, int endSec);
};

